Wt3.2.3文档翻译:Wt::Dbo::collection< C >类模板参考,Wt::Dbo::collection< C > Class Template Reference
这是一个标准模板库(STL)的容器,用来在查询结果中遍历。
这是一个与标准模板库兼容的容器,其背后是一个用于获取数据的结构化查询语句(SQL)查询对象。
集合对象在Wt::Dbo 中有两种用途:
•.遍历一个查询的结果;
•.用来映射一个多对一(Many-to-One)或多对多(Many-to-Many)关系的 “多”的那一方 (many-side) 。
它的迭代器满足的是输入迭代器(InputIterator)的需求,这就意味着 ,妳只能单向地 (solely)遍历 begin() 和 end() 之间的这些结果 :交替地 , 读取一个元素 ,然后增加迭代器 。当这个集合被用来表示一个 查询 的结果的时候 ,妳只能对结果遍历一次 :也就是说 ,妳只能对 begin() 调用一次。
当此容器被用来反映一个查询的结果时,它本身是只读的。不过呢 ,如果牵涉到一个多对一或多对多关系的话 ,妳可以插入 ( insert() )及删除( erase() )其中的对象。
一般应用场景中,妳会遍历这个容器中的结果 ,用于本地处理,或者将这些结果复制到一个标准的标准模板库 (STL)容器中以便作进一步的处理。不仅仅是迭代器的虚弱保证 (weak guarantees of the iterators) 使得这种做法成为建议做法,还因为 ,在此库的当前实现中 ,所有的结构化查询语言语句都是不可重入的预准备的语句 (这种限制有可能在未来去掉):在每个会话中,对于同一个结构化查询语言语句,同一时刻只能有一个集合处于使用状态中 。所以 ,以下代码会出错:
void iterateChildren(Wt::Dbo::ptr<Comment> comment)
{
typedef Wt::Dbo::collection<Wt::Dbo::ptr<Comment> > Comments;
Comments children = comment->children;
for (Comments::const_iterator i = children.begin(); i != children.end(); ++i) {
std::cerr << "Comment: " << i->text << std::endl;
iterateChildren(*i); // 非法的用法,因为这样会导致嵌套地使用同一个查询。
}
}
如果妳不确定在遍历的过程中同一个查询是不是会被重复使用的话,那么妳应当把那些结果复制到一个标准的容器中 。注意,这个复制过程中不会有大的开销 ,因为数据库对象 (dbo) 指针都是轻量级的。
void iterateChildren(Wt::Dbo::ptr<Comment> comment)
{
typedef std::vector<Wt::Dbo::ptr<Comment> > Comments;
Comments children(comment->children.begin(), comment->children.end()); // 复制到一个标准模板库容器中,放过底层的查询对象 ,以便重用
for (Comments::const_iterator i = children.begin(); i != children.end(); ++i) {
std::cerr << "Comment: " << i->text << std::endl;
iterateChildren(*i); // 现在是正确的了。
}
}
在遍历一个集合之前,会话会被刷新(flushed)。这样 ,集合就会反映出任何处于待定状态 (pending)的脏(dirty)的变更。
辛迪-克劳馥
HxLauncher: Launch Android applications by voice commands